const PlatformDetector = require('./js/PlatformDetector');

// 初始化平台检测
PlatformDetector.init();

class TodoApp {
    constructor() {
        // console.log('开始初始化 TodoApp...');

        try {
            this.taskManager = new TaskManager();
            // console.log('TaskManager 初始化成功');

            this.pomodoroTimer = new PomodoroTimer();
            // console.log('PomodoroTimer 初始化成功');

            this.uiRenderer = new UIRenderer(this.taskManager);
            // console.log('UIRenderer 初始化成功');

            this.inputController = new InputController();
            // console.log('InputController 初始化成功');

            this.authManager = new AuthManager();
            // console.log('AuthManager 初始化成功');

            this.whiteNoiseManager = new WhiteNoiseManager();
            // console.log('WhiteNoiseManager 初始化成功');

            // 初始化管理器
            this.eventManager = new EventManager(this);
            // console.log('EventManager 初始化成功');

            this.modalManager = new ModalManager(this);
            // console.log('ModalManager 初始化成功');

            this.settingsManager = new SettingsManager();
            // console.log('SettingsManager 初始化成功');

            this.accountDropdownManager = new AccountDropdownManager(this);
            // console.log('AccountDropdownManager 初始化成功');

            // 初始化同步管理器
            this.syncManager = new SyncManager(this.authManager, this.taskManager, this);
            // console.log('SyncManager 初始化成功');

            this.accountDropdownManager.setSyncManager(this.syncManager);
            // console.log('所有管理器初始化完成');

            this.init();
        } catch (error) {
            console.error('TodoApp 初始化失败:', error);
            console.error('错误堆栈:', error.stack);
        }
    }

    async init() {
        // 并行加载数据和设置UI
        const loadPromises = [
            this.taskManager.loadTodos(),
            this.modalManager.init(),
            this.pomodoroTimer.setupTimer()
        ];
        
        // 立即设置事件监听器和UI（不依赖数据）
        this.eventManager.setupEventListeners();
        this.accountDropdownManager.setupAccountDropdown();
        
        // 先显示基础UI
        this.uiRenderer.updateUI();
        
        // 等待数据加载完成后更新UI
        await Promise.all(loadPromises);
        this.uiRenderer.updateUI(); // 再次更新以显示数据
        
        // 设置应用级别的生命周期处理
        this.setupAppLifecycle();
        
        // 异步检查认证状态（不阻塞UI显示）
        this.checkAuthenticationStatus();
    }
    
    // 新增：检查认证状态的方法
    // 修改 checkAuthenticationStatus 方法
    async checkAuthenticationStatus() {
        if (!this.authManager.isLoggedIn) {
            // 立即显示登录界面，无需延迟
            this.authManager.showLoginModal();
            return;
        }
        
        // 有登录信息，验证 token 是否有效
        console.log('验证登录状态...');
        const isValid = await this.authManager.validateToken();
        
        if (isValid) {
            // Token 有效，立即启动同步（后台进行）
            console.log('登录状态有效，开始同步...');
            this.syncManager.syncNow(); // 移除 setTimeout
        } else {
            // Token 无效，立即显示登录界面
            console.log('登录状态无效，需要重新登录');
            this.authManager.showLoginModal(); // 移除 setTimeout
        }
    }

    // 新增：设置应用生命周期处理
    setupAppLifecycle() {
        // 移除这里的重复清理，让 WhiteNoiseManager 自己处理
        // window.addEventListener('beforeunload', () => {
        //     if (this.whiteNoiseManager) {
        //         this.whiteNoiseManager.cleanup();
        //     }
        // });
    
        // 监听页面可见性变化，确保后台播放
        document.addEventListener('visibilitychange', () => {
            if (document.hidden) {
                console.log('应用进入后台，保持白噪音播放');
                // 后台时不做任何操作，保持播放
            } else {
                console.log('应用回到前台');
                // 前台时可以进行UI更新等操作
            }
        });
    }

    async addTask(text = null, pomodoros = 0, dueDate = null, priority = 'medium') {
        // 如果没有传入text参数，从输入框获取
        const input = document.querySelector('.add-task-input input');
        text = input.value.trim();

        if (!text) return;

        // 检查任务数量限制（仅在从输入框添加时检查）
        const currentTaskCount = this.taskManager.todos.length;
        if (!this.authManager.canAddTask(currentTaskCount)) {
            this.authManager.showTaskLimitNotice();
            return;
        } else {
            // 添加任务
            this.taskManager.addTask(text, pomodoros, dueDate, priority);
            await this.taskManager.saveTodos();
            this.uiRenderer.updateUI();
        }
    }

    switchCategory(category) {
        // 更新导航状态
        document.querySelectorAll('.nav-item').forEach(item => {
            item.classList.remove('active');
        });
        document.querySelector(`[data-category="${category}"]`).classList.add('active');

        this.taskManager.switchCategory(category);
        this.uiRenderer.updateUI();
    }

    async toggleTask(id) {
        // 确保id是字符串类型
        const taskId = String(id);
        
        // 记录任务切换前的状态
        const taskBefore = this.taskManager.getTaskById(taskId);
        
        // 添加防护检查
        if (!taskBefore) {
            console.error('未找到要切换的任务，ID:', taskId);
            return;
        }
        
        console.log('切换任务前状态:', {
            id: taskBefore.id,
            text: taskBefore.text,
            completed: taskBefore.completed
        });
    
        this.taskManager.toggleTask(taskId);
    
        // 记录任务切换后的状态
        const taskAfter = this.taskManager.getTaskById(taskId);
        
        // 添加防护检查
        if (!taskAfter) {
            console.error('切换任务后未找到任务，ID:', taskId);
            return;
        }
        
        console.log('切换任务后状态:', {
            id: taskAfter.id,
            text: taskAfter.text,
            completed: taskAfter.completed
        });
    
        await this.taskManager.saveTodos();
        console.log('任务状态已保存到存储');
    
        this.uiRenderer.updateUI();
        console.log('UI已更新');
    }

    async deleteTask(id) {
        this.taskManager.deleteTask(id);
        await this.taskManager.saveTodos();
        this.uiRenderer.updateUI();
    }

    // 在 TodoApp 类中添加调试方法
    debugTaskCounts() {
        console.log('=== 任务计数调试信息 ===');
        console.log('所有任务:', this.taskManager.todos);

        const highPriorityTasks = this.taskManager.todos.filter(todo => {
            console.log(`任务: ${todo.text}, 优先级: ${todo.priority}, 完成状态: ${todo.completed}`);
            return todo.priority === 'high' && !todo.completed;
        });

        console.log('高优先级未完成任务:', highPriorityTasks);
        console.log('高优先级计数:', highPriorityTasks.length);

        // 检查所有优先级的分布
        const priorityDistribution = {};
        this.taskManager.todos.forEach(todo => {
            const key = `${todo.priority}-${todo.completed ? 'completed' : 'active'}`;
            priorityDistribution[key] = (priorityDistribution[key] || 0) + 1;
        });

        console.log('优先级分布:', priorityDistribution);
    }

    // 新增：更新任务优先级
    async updateTaskPriority(id, priority) {
        this.taskManager.updateTask(id, { priority });
        await this.taskManager.saveTodos();
        this.uiRenderer.updateUI();
    }

    // 新增：切换视图
    switchView(view) {
        this.taskManager.switchView(view);

        // 更新切换按钮状态
        document.querySelectorAll('.toggle-btn').forEach(btn => {
            btn.classList.remove('active');
            if ((view === 'kanban' && btn.textContent.trim() === '看板') ||
                (view === 'list' && btn.textContent.trim() === '列表')) {
                btn.classList.add('active');
            }
        });

        this.uiRenderer.updateUI();
    }

    // 新增：更新任务状态
    async updateTaskStatus(id, status) {
        this.taskManager.updateTaskStatus(id, status);
        await this.taskManager.saveTodos();
        this.uiRenderer.updateUI();
    }

    // 代理方法，用于向后兼容
    confirmDeleteTask(id) {
        return this.modalManager.confirmDeleteTask(id);
    }

    showTaskDetail(taskId) {
        return this.modalManager.showTaskDetail(taskId);
    }
}

// 确保在页面卸载时清理资源
window.addEventListener('beforeunload', () => {
    // 记录清理时间戳
    localStorage.setItem('whiteNoiseLastCleanup', Date.now().toString());
});

// 创建全局应用实例
const app = new TodoApp();

// 确保全局访问
window.app = app;

// 导出应用实例
if (typeof module !== 'undefined' && module.exports) {
    module.exports = app;
}